package com.sheng.leetcode.year2022.month07.day20;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author liusheng
 * @date 2022/07/20
 *
 * 1260. 二维网格迁移
 *
 * 给你一个 m 行 n 列的二维网格 grid 和一个整数 k。你需要将 grid 迁移 k 次。
 * 每次「迁移」操作将会引发下述活动：
 * 位于 grid[i][j] 的元素将会移动到 grid[i][j + 1]。
 * 位于 grid[i][n - 1] 的元素将会移动到 grid[i + 1][0]。
 * 位于 grid[m - 1][n - 1] 的元素将会移动到 grid[0][0]。
 * 请你返回 k 次迁移操作后最终得到的 二维网格。
 *
 * 示例 1：
 * 输入：grid = [[1,2,3],[4,5,6],[7,8,9]], k = 1
 * 输出：[[9,1,2],[3,4,5],[6,7,8]]
 *
 * 示例 2：
 * 输入：grid = [[3,8,1,9],[19,7,2,5],[4,6,11,10],[12,0,21,13]], k = 4
 * 输出：[[12,0,21,13],[3,8,1,9],[19,7,2,5],[4,6,11,10]]
 *
 * 示例 3：
 * 输入：grid = [[1,2,3],[4,5,6],[7,8,9]], k = 9
 * 输出：[[1,2,3],[4,5,6],[7,8,9]]
 *
 * 提示：
 *
 * m == grid.length
 * n == grid[i].length
 * 1 <= m <= 50
 * 1 <= n <= 50
 * -1000 <= grid[i][j] <= 1000
 * 0 <= k <= 100
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/shift-2d-grid
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode1260 {

    @Test
    public void test01() {
//        int[][] grid = {{1,2,3},{4,5,6},{7,8,9}};
//        int k = 1;
//        int[][] grid = {{3,8,1,9},{19,7,2,5},{4,6,11,10},{12,0,21,13}};
//        int k = 4;
        int[][] grid = {{1,2,3},{4,5,6},{7,8,9}};
        int k = 9;
        System.out.println(new Solution().shiftGrid(grid, k));
    }

}
class Solution {

    int m, n;
    public List<List<Integer>> shiftGrid(int[][] grid, int k) {
        //m * n的二维数组
        m = grid.length;
        n = grid[0].length;
        while (k > 0) {
            //执行[迁移]transfer
            transfer(grid);
            k--;
        }
        return Arrays.stream(grid).map(i -> {
            return Arrays.stream(i).boxed().collect(Collectors.toList());
        }).collect(Collectors.toList());
    }

    public void transfer(int[][] grid) {
        int num = grid[0][0];
        int t = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                //对数组中元素位置进行判断，进行不同的迁移
                if (i == m - 1 && j == n - 1) {
                    //最后一个元素
                    t = num;
                    num = grid[0][0];
                    grid[0][0] = t;
                } else if (j == n - 1) {
                    //每行最后一个元素
                    t = num;
                    num = grid[i + 1][0];
                    grid[i + 1][0] = t;
                } else {
                    //普通元素
                    t = num;
                    num = grid[i][j + 1];
                    grid[i][j + 1] = t;
                }
            }
        }
    }
}

//class Solution {
//    public List<List<Integer>> shiftGrid(int[][] g, int k) {
//        int n = g.length, m = g[0].length;
//        int[][] mat = new int[n][m];
//        for (int i = 0; i < m; i++) {
//            int tcol = (i + k) % m, trow = ((i + k) / m) % n, idx = 0;
//            while (idx != n) mat[(trow++) % n][tcol] = g[idx++][i];
//        }
//        List<List<Integer>> ans = new ArrayList<>();
//        for (int i = 0; i < n; i++) {
//            List<Integer> alist = new ArrayList<>();
//            for (int j = 0; j < m; j++) alist.add(mat[i][j]);
//            ans.add(alist);
//        }
//        return ans;
//    }
//}
//
//作者：AC_OIer
//链接：https://leetcode.cn/problems/shift-2d-grid/solution/by-ac_oier-1blt/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
